package com.pawernode.config;

import lombok.Data;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ配置类，用于定义交换机、队列以及它们之间的绑定关系
 */
@Configuration
@ConfigurationProperties(prefix = "my") //配置属性
@Data
public class RabbitConfig {
    // 交换机的名字
//    @Value("${my.exchangeName}")
    private String exchangeName;
    // 队列A的名字
//    @Value("${my.queueAName}")
    private String queueAName;
    // 队列B的名字
//    @Value("${my.queueBName}")
    private String queueBName;

    // 三部曲
    // 1，定义交换机
    /**
     * 创建直接交换机
     * @return DirectExchange类型的交换机
     */
    @Bean
    public DirectExchange directExchange() {
        return ExchangeBuilder.directExchange(exchangeName).build();
    }

    // 2，定义队列
    /**
     * 创建队列A
     * @return 队列A的实例
     */
    @Bean
    public Queue queueA() {
        return QueueBuilder.durable(queueAName).build();
    }

    /**
     * 创建队列B
     * @return 队列B的实例
     */
    @Bean
    public Queue queueB() {
        return QueueBuilder.durable(queueBName).build();
    }

    // 3，绑定交换机与队列
    /**
     * 将队列A绑定到交换机上，并指定路由键为"error"
     * @param directExchange 直接交换机
     * @param queueA 队列A
     * @return 绑定对象
     */
    @Bean
    public Binding bindingA(DirectExchange directExchange, Queue queueA) {
        return BindingBuilder.bind(queueA).to(directExchange).with("error");
    }

    /**
     * 将队列B绑定到交换机上，并指定路由键为"info"
     * @param directExchange 直接交换机
     * @param queueB 队列B
     * @return 绑定对象
     */
    @Bean
    public Binding bindingB1(DirectExchange directExchange, Queue queueB) {
        return BindingBuilder.bind(queueB).to(directExchange).with("info");
    }

    /**
     * 将队列B绑定到交换机上，并指定路由键为"error"
     * 这里展示了同一个队列可以使用不同的路由键绑定到同一个交换机
     * @param directExchange 直接交换机
     * @param queueB 队列B
     * @return 绑定对象
     */
    @Bean
    public Binding bindingB2(DirectExchange directExchange, Queue queueB) {
        return BindingBuilder.bind(queueB).to(directExchange).with("error");
    }

    /**
     * 将队列B绑定到交换机上，并指定路由键为"warning"
     * 同样展示了如何使用多个路由键将同一个队列绑定到同一个交换机
     * @param directExchange 直接交换机
     * @param queueB 队列B
     * @return 绑定对象
     */
    @Bean
    public Binding bindingB3(DirectExchange directExchange, Queue queueB) {
        return BindingBuilder.bind(queueB).to(directExchange).with("warning");
    }
}
